/*
 *   Copyright (C) @2021 Webank Group Holding Limited
 *   <p>
 *   Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
 *  in compliance with the License. You may obtain a copy of the License at
 *  <p>
 *  http://www.apache.org/licenses/LICENSE-2.0
 *   <p>
 *   Unless required by applicable law or agreed to in writing, software distributed under the License
 *   is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
 *  or implied. See the License for the specific language governing permissions and limitations under
 *  he License.
 *
 */

package com.webank.openledger.contracts.gov_account;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.fisco.bcos.sdk.abi.FunctionReturnDecoder;
import org.fisco.bcos.sdk.abi.TypeReference;
import org.fisco.bcos.sdk.abi.datatypes.Address;
import org.fisco.bcos.sdk.abi.datatypes.Bool;
import org.fisco.bcos.sdk.abi.datatypes.Event;
import org.fisco.bcos.sdk.abi.datatypes.Function;
import org.fisco.bcos.sdk.abi.datatypes.Type;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple1;
import org.fisco.bcos.sdk.abi.datatypes.generated.tuples.generated.Tuple2;
import org.fisco.bcos.sdk.client.Client;
import org.fisco.bcos.sdk.contract.Contract;
import org.fisco.bcos.sdk.crypto.CryptoSuite;
import org.fisco.bcos.sdk.crypto.keypair.CryptoKeyPair;
import org.fisco.bcos.sdk.eventsub.EventCallback;
import org.fisco.bcos.sdk.model.CryptoType;
import org.fisco.bcos.sdk.model.TransactionReceipt;
import org.fisco.bcos.sdk.model.callback.TransactionCallback;
import org.fisco.bcos.sdk.transaction.model.exception.ContractException;

@SuppressWarnings("unchecked")
public class AccountManager extends Contract {
    public static final String[] BINARY_ARRAY = {"6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440a806100536000396000f30060806040526004361062000103576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806313af403514620001085780634031d6ae146200014e57806345c8b1a614620001ac57806346438ca0146200020a578063582930351462000290578063789a0ed514620003415780638428f258146200039f5780638d1fdf2f14620003fd5780639d33dc0d146200045b578063ad0f024414620004d9578063b2bdfa7b146200050b578063b8c1828e1462000565578063c4dad5ce14620005c3578063c8e40fbf1462000641578063ec17d025146200069f578063fb47e01614620006fd578063ff8698381462000783575b600080fd5b3480156200011557600080fd5b506200014c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620007e1565b005b3480156200015b57600080fd5b5062000192600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000969565b604051808215151515815260200191505060405180910390f35b348015620001b957600080fd5b50620001f0600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200097e565b604051808215151515815260200191505060405180910390f35b3480156200021757600080fd5b506200024e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000bf8565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200029d57600080fd5b50620002f4600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000c61565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b3480156200034e57600080fd5b5062000385600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200101a565b604051808215151515815260200191505060405180910390f35b348015620003ac57600080fd5b50620003e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001314565b604051808215151515815260200191505060405180910390f35b3480156200040a57600080fd5b5062000441600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200160e565b604051808215151515815260200191505060405180910390f35b3480156200046857600080fd5b50620004bf600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001888565b604051808215151515815260200191505060405180910390f35b348015620004e657600080fd5b50620004f162001989565b604051808215151515815260200191505060405180910390f35b3480156200051857600080fd5b50620005236200199b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200057257600080fd5b50620005a9600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620019c0565b604051808215151515815260200191505060405180910390f35b348015620005d057600080fd5b5062000627600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001abf565b604051808215151515815260200191505060405180910390f35b3480156200064e57600080fd5b5062000685600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200209d565b604051808215151515815260200191505060405180910390f35b348015620006ac57600080fd5b50620006e3600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200211f565b604051808215151515815260200191505060405180910390f35b3480156200070a57600080fd5b5062000741600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200262e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200079057600080fd5b50620007c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062002697565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620008cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b6000620009778233620027d7565b9050919050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000a6e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fc0d78d00cd87c129d30acb1af322bfdda683a26281ce525d9dbbf5223709873230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16636a28f0006040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000bb257600080fd5b505af115801562000bc7573d6000803e3d6000fd5b505050506040513d602081101562000bde57600080fd5b810190808051906020019092919050505092505050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600080600080856000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151562000d7c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f616c726561647920657869737465642e0000000000000000000000000000000081525060400191505060405180910390fd5b3033888862000d8a62002fee565b808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050604051809103906000f08015801562000e76573d6000803e3d6000fd5b50925082915081600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f9e9b7ad5aa","df19ffbb1e871018274dedcd0a276d311a7cbf5138e1d5e516feb730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3600182945094505050509250929050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663d195143c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200110057600080fd5b505af115801562001115573d6000803e3d6000fd5b505050506040513d60208110156200112c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515620011ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fc0d78d00cd87c129d30acb1af322bfdda683a26281ce525d9dbbf5223709873230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16636a28f0006040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620012ce57600080fd5b505af1158015620012e3573d6000803e3d6000fd5b505050506040513d6020811015620012fa57600080fd5b810190808051906020019092919050505092505050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1663d195143c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620013fa57600080fd5b505af11580156200140f573d6000803e3d6000fd5b505050506040513d60208110156200142657600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff16141515620014e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167f244b9baf4950ca2fe1a97e6554bb3d42adcb5176ed4c2cccdcac5ba347083faf30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166362a5af3b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620015c857600080fd5b505af1158015620015dd573d6000803e3d6000fd5b505050506040513d6020811015620015f457600080fd5b810190808051906020019092919050505092505050919050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620016fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167f244b9baf4950ca2fe1a97e6554bb3d42adcb5176ed4c2cccdcac5ba347083faf30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166362a5af3b6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200184257600080fd5b505af115801562001857573d6000803e3d6000fd5b505050506040513d60208110156200186e57600080fd5b810190808051906020019092919050505092505050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001975576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b620019818383620027d7565b905092915050565b6000620019963362002c4a565b905090565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001aad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b62001ab88262002c4a565b9050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001bda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508291503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663d195143c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562001cbb57600080fd5b505af115801562001cd0573d6000803e3d6000fd5b505050506040513d602081101562001ce757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151562001daa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f4163636f756e744d616e616765723a206f6e6c79206163636f756e742061646d81526020017f696e20697320617574686f72697a65642e00000000000000000000000000000081525060400191505060405180910390fd5b82600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8dd2cc620baff525b40e073032a29d6c425c4bfd40ab80cfb2d0270cf7ae7d7130604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191","505060405180910390a38173ffffffffffffffffffffffffffffffffffffffff16632b3c0a40876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156200205257600080fd5b505af115801562002067573d6000803e3d6000fd5b505050506040513d60208110156200207e57600080fd5b8101908080519060200190929190505050506001935050505092915050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156200223a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508291503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1663d195143c6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200231b57600080fd5b505af115801562002330573d6000803e3d6000fd5b505050506040513d60208110156200234757600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156200240a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff167f8c10fb30e3dc93f1332bdb81522fd134da355b8188e1aa3e7adb3a2ca90e8e5f30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663ea8a1af06040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620025e757600080fd5b505af1158015620025fc573d6000803e3d6000fd5b505050506040513d60208110156200261357600080fd5b81019080805190602001909291905050509350505050919050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff161415620027285760009250620027d0565b8190508073ffffffffffffffffffffffffffffffffffffffff16638866eaec6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200279057600080fd5b505af1158015620027a5573d6000803e3d6000fd5b505050506040513d6020811015620027bc57600080fd5b810190808051906020019092919050505092505b5050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515620028f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925082600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f8dd2cc620baff525b40e073032a29d6c425c4bfd40ab80cfb2d0270cf7ae7d7130604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a38291508173ffffffffffffffffffffffffffffffffffffffff16632b3c0a40876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801562002bff57600080fd5b505af115801562002c14573d6000803e3d6000fd5b505050506040513d602081101562002c2b57600080fd5b8101908080519060200190929190505050506001935050505092915050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562002d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508291508473ffffffffffffffffffffffffffffffffffffffff167f8c10fb30e3dc93f1332bdb81522fd134da355b8188e1aa3e7adb3a2ca90e8e5f30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663ea8a1af06040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562002fa757600080fd5b505af11580","1562002fbc573d6000803e3d6000fd5b505050506040513d602081101562002fd357600080fd5b81019080805190602001909291905050509350505050919050565b6040516113df806200300083390190560060806040526000600260146101000a81548160ff021916908360ff16021790555034801561002c57600080fd5b506040516080806113df833981018060405281019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508383336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061014b82610195640100000000026401000000009004565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505061031c565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561027f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b6110b48061032b6000396000f3006080604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff1680630fb3844c146100bf57806313af4035146100f05780632b3c0a40146101335780633bc5de301461018e57806361dfdae6146101e557806362a5af3b146102405780636a28f0001461026f5780638866eaec1461029e578063b2623cb0146102cd578063b2bdfa7b14610324578063d195143c1461037b578063ea8a1af0146103d2575b600080fd5b3480156100cb57600080fd5b506100d4610401565b604051808260ff1660ff16815260200191505060405180910390f35b3480156100fc57600080fd5b50610131600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610414565b005b34801561013f57600080fd5b50610174600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505061059b565b604051808215151515815260200191505060405180910390f35b34801561019a57600080fd5b506101a3610729565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101f157600080fd5b50610226600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610753565b604051808215151515815260200191505060405180910390f35b34801561024c57600080fd5b506102556108e2565b604051808215151515815260200191505060405180910390f35b34801561027b57600080fd5b50610284610b70565b604051808215151515815260200191505060405180910390f35b3480156102aa57600080fd5b506102b3610e0c565b604051808215151515815260200191505060405180910390f35b3480156102d957600080fd5b506102e2610e28565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561033057600080fd5b50610339610e4e565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561038757600080fd5b50610390610e73565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103de57600080fd5b506103e7610e9d565b604051808215151515815260200191505060405180910390f35b600260149054906101000a900460ff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167fc66d1d23a5b7baf1f496bb19f580d7b12070ad5a08a758c990db97d961fa33a660405160405180910390a350565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106465750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806107fe5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610898576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16148061098d5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610a27576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610a2f610e0c565b1515610ac9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600260146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c1b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610cb5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020","017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600260149054906101000a900460ff1660ff16141515610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600260146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b600080600260149054906101000a900460ff1660ff1614905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f485750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610fe2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028060146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f7d78a1adf6a29dad801d43ddd0c4478ec0cbf1bd9bfdd2e007d90429959f363e30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a260019050905600a165627a7a723058209bc26b9624b1f3cb0198101f2bd9141c4ade4355f17e25efbbbd2030d678a37c0029a165627a7a723058204e10eeac064050489e9e250ac150836d2366a8cabd3cf80a713d4865ba7b197f0029"};

    public static final String BINARY = String.join("", BINARY_ARRAY);

    public static final String[] SM_BINARY_ARRAY = {"6080604052336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555061440a806100536000396000f30060806040526004361062000103576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305282c70146200010857806328e91489146200014e57806361cb24c314620001a85780638b9b8e5c14620002065780639e4ad09b14620002645780639e57312e14620002c2578063a5d51f741462000340578063b54ef4a114620003c6578063ba0137121462000424578063c4dcade61462000482578063c8d83aaf1462000508578063cff04a42146200053a578063d65f68ba1462000598578063dbe09bdc1462000616578063de1ed23514620006c7578063ef0c4a1c1462000725578063f12c66df1462000783575b600080fd5b3480156200011557600080fd5b506200014c600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620007e1565b005b3480156200015b57600080fd5b506200016662000969565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620001b557600080fd5b50620001ec600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200098e565b604051808215151515815260200191505060405180910390f35b3480156200021357600080fd5b506200024a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000c08565b604051808215151515815260200191505060405180910390f35b3480156200027157600080fd5b50620002a8600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000f02565b604051808215151515815260200191505060405180910390f35b348015620002cf57600080fd5b5062000326600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062000f84565b604051808215151515815260200191505060405180910390f35b3480156200034d57600080fd5b5062000384600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001562565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b348015620003d357600080fd5b506200040a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620015cb565b604051808215151515815260200191505060405180910390f35b3480156200043157600080fd5b5062000468600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050620016ca565b604051808215151515815260200191505060405180910390f35b3480156200048f57600080fd5b50620004c6600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200180a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156200051557600080fd5b506200052062001873565b604051808215151515815260200191505060405180910390f35b3480156200054757600080fd5b506200057e600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001885565b604051808215151515815260200191505060405180910390f35b348015620005a557600080fd5b50620005fc600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200189a565b604051808215151515815260200191505060405180910390f35b3480156200062357600080fd5b506200067a600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200199b565b60405180831515151581526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019250505060405180910390f35b348015620006d457600080fd5b506200070b600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062001d54565b604051808215151515815260200191505060405180910390f35b3480156200073257600080fd5b5062000769600480360381019080803573ffffffffffffffffffffffffffffffffffffffff16906020019092919050505062002263565b604051808215151515815260200191505060405180910390f35b3480156200079057600080fd5b50620007c7600480360381019080803573ffffffffffffffffffffffffffffffffffffffff1690602001909291905050506200255d565b604051808215151515815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620008cc576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562000a7e576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fff8289a1541a8bd747b4e19602ccecd11a469b14671d7cc3325062c974c3ae6330604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166308165cd66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000bc257600080fd5b505af115801562000bd7573d6000803e3d6000fd5b505050506040513d602081101562000bee57600080fd5b810190808051906020019092919050505092505050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16634292918f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000cee57600080fd5b505af115801562000d03573d6000803e3d6000fd5b505050506040513d602081101562000d1a57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151562000ddd576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fde9b2f6104fa4abead11e320ea9108a54d8f81193384f019ee98c0bfe5b029ed30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16638f55e2256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562000ebc57600080fd5b505af115801562000ed1573d6000803e3d6000fd5b505050506040513d602081101562000ee857600080fd5b810190808051906020019092919050505092505050919050565b600080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffff","ffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141515156200109f576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508291503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16634292918f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200118057600080fd5b505af115801562001195573d6000803e3d6000fd5b505050506040513d6020811015620011ac57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156200126f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260318152602001807f4163636f756e744d616e616765723a206f6e6c79206163636f756e742061646d81526020017f696e20697320617574686f72697a65642e00000000000000000000000000000081525060400191505060405180910390fd5b82600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f3800db655763ee91d8147809ddca52183b58036e8a8c952c5d1352c72afb660230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a38173ffffffffffffffffffffffffffffffffffffffff16638b011498876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b1580156200151757600080fd5b505af11580156200152c573d6000803e3d6000fd5b505050506040513d60208110156200154357600080fd5b8101908080519060200190929190505050506001935050505092915050565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16141515620016b8576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b620016c382620027d7565b9050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16915060008273ffffffffffffffffffffffffffffffffffffffff1614156200175b576000925062001803565b8190508073ffffffffffffffffffffffffffffffffffffffff166335968e686040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b158015620017c357600080fd5b505af1158015620017d8573d6000803e3d6000fd5b505050506040513d6020811015620017ef57600080fd5b810190808051906020019092919050505092505b5050919050565b6000600260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006200188033620027d7565b905090565b600062001893823362002b7b565b9050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151562001987576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b62001993838362002b7b565b905092915050565b600080600080856000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151562001ab6576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260308152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f616c726561647920657869737465642e0000000000000000000000000000000081525060400191505060405180910390fd5b3033888862001ac462002fee565b808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020018273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001945050505050604051809103906000f08015801562001bb0573d6000803e3d6000fd5b50925082915081600160008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555086600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167f25d37cca48ccf96ed90675991ae3f4fdb428d2cd704ea14c1bd2d9ab6021214530604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a3600182945094505050509250929050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562001e6f576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692508291503373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16634292918f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562001f5057600080fd5b505af115801562001f65573d6000803e3d6000fd5b505050506040513d602081101562001f7c57600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff161415156200203f5760","40517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff167fb1dbc1be8412705445ee41c620d31c010ba14cd0cb0f28972f45b7f72b41c25d30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663df3150aa6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200221c57600080fd5b505af115801562002231573d6000803e3d6000fd5b505050506040513d60208110156200224857600080fd5b81019080805190602001909291905050509350505050919050565b6000806000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16634292918f6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200234957600080fd5b505af11580156200235e573d6000803e3d6000fd5b505050506040513d60208110156200237557600080fd5b810190808051906020019092919050505073ffffffffffffffffffffffffffffffffffffffff1614151562002438576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f4163636f756e744d616e616765723a206f6e6c792061646d696e20697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b8373ffffffffffffffffffffffffffffffffffffffff167fff8289a1541a8bd747b4e19602ccecd11a469b14671d7cc3325062c974c3ae6330604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff166308165cd66040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200251757600080fd5b505af11580156200252c573d6000803e3d6000fd5b505050506040513d60208110156200254357600080fd5b810190808051906020019092919050505092505050919050565b60008060008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156200264d576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1691508190508373ffffffffffffffffffffffffffffffffffffffff167fde9b2f6104fa4abead11e320ea9108a54d8f81193384f019ee98c0bfe5b029ed30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28073ffffffffffffffffffffffffffffffffffffffff16638f55e2256040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b1580156200279157600080fd5b505af1158015620027a6573d6000803e3d6000fd5b505050506040513d6020811015620027bd57600080fd5b810190808051906020019092919050505092505050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614151515620028f2576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1692506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508291508473ffffffffffffffffffffffffffffffffffffffff167fb1dbc1be8412705445ee41c620d31c010ba14cd0cb0f28972f45b7f72b41c25d30604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a28173ffffffffffffffffffffffffffffffffffffffff1663df3150aa6040518163ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401602060405180830381600087803b15801562002b3457600080fd5b505af115801562002b49573d6000803e3d6000fd5b505050506040513d602081101562002b6057600080fd5b81019080805190602001909291905050509350505050919050565b6000806000836000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415151562002c96576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602c8152602001807f4163636f756e744d616e616765723a2065787465726e616c4163636f756e742081526020017f6e6f7420657869737465642e000000000000000000000000000000000000000081525060400191505060405180910390fd5b600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16925082600160008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600160008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f3800db655763ee91d8147809ddca52183b58036e8a8c952c5d1352c72afb660230604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a38291508173ffffffffffffffffffffffffffffffffffffffff16638b011498876040518263ffffffff167c0100000000000000000000000000000000000000000000000000000000028152600401808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001915050602060405180830381600087803b15801562002fa357600080fd5b505af115801562002f","b8573d6000803e3d6000fd5b505050506040513d602081101562002fcf57600080fd5b8101908080519060200190929190505050506001935050505092915050565b6040516113df806200300083390190560060806040526000600260146101000a81548160ff021916908360ff16021790555034801561002c57600080fd5b506040516080806113df833981018060405281019080805190602001909291908051906020019092919080519060200190929190805190602001909291905050508383336000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555081600160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505061014b82610195640100000000026401000000009004565b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505050505061031c565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614151561027f576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6110b48061032b6000396000f3006080604052600436106100ba576000357c0100000000000000000000000000000000000000000000000000000000900463ffffffff16806305282c70146100bf57806308165cd6146101025780631e9117501461013157806328e914891461018c57806335968e68146101e3578063398fc781146102125780634292918f146102695780638b011498146102c05780638f55e2251461031b578063df3150aa1461034a578063e211e0c114610379578063ede7ddf6146103d0575b600080fd5b3480156100cb57600080fd5b50610100600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610401565b005b34801561010e57600080fd5b50610117610588565b604051808215151515815260200191505060405180910390f35b34801561013d57600080fd5b50610172600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610824565b604051808215151515815260200191505060405180910390f35b34801561019857600080fd5b506101a16109b3565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156101ef57600080fd5b506101f86109d8565b604051808215151515815260200191505060405180910390f35b34801561021e57600080fd5b506102276109f4565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b34801561027557600080fd5b5061027e610a1a565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156102cc57600080fd5b50610301600480360381019080803573ffffffffffffffffffffffffffffffffffffffff169060200190929190505050610a44565b604051808215151515815260200191505060405180910390f35b34801561032757600080fd5b50610330610bd2565b604051808215151515815260200191505060405180910390f35b34801561035657600080fd5b5061035f610e60565b604051808215151515815260200191505060405180910390f35b34801561038557600080fd5b5061038e61104b565b604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390f35b3480156103dc57600080fd5b506103e5611075565b604051808260ff1660ff16815260200191505060405180910390f35b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161415156104eb576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260298152602001807f574542617369634163636f756e743a206f6e6c79206f776e657220697320617581526020017f74686f72697a65642e000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f480107a875206c9f5ec6e8b65d989106e27d0fc8b130625b25997540ddfc334a60405160405180910390a350565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806106335750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b15156106cd576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600260149054906101000a900460ff1660ff1614151561077d576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602d8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f2069732061626e6f726d616c2e0000000000000000000000000000000000000081525060400191505060405180910390fd5b6000600260146101000a81548160ff021916908360ff1602179055507f756e667265657a650000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614806108cf5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610969576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b81600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000809054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600080600260149054906101000a900460ff1660ff1614905090565b600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610aef5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610b89576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060019050919050565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610c7d5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610d","17576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b610d1f6109d8565b1515610db9576040517fc703cb1200000000000000000000000000000000000000000000000000000000815260040180806020018281038252602b8152602001807f426173654163636f756e743a206f6e6c79206163636f756e742073746174757381526020017f206973206e6f726d616c2e00000000000000000000000000000000000000000081525060400191505060405180910390fd5b6001600260146101000a81548160ff021916908360ff1602179055507f667265657a6500000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000600160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161480610f0b5750600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16145b1515610fa5576040517fc703cb120000000000000000000000000000000000000000000000000000000081526004018080602001828103825260228152602001807f426173654163636f756e743a206f6e6c79206163636f756e74206d616e61676581526020017f722e00000000000000000000000000000000000000000000000000000000000081525060400191505060405180910390fd5b60028060146101000a81548160ff021916908360ff1602179055507f63616e63656c00000000000000000000000000000000000000000000000000007f598b76607bab91793e04db590052049ff4ca46cfc234328da5536f5169790af730604051808273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200191505060405180910390a26001905090565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600260149054906101000a900460ff16815600a165627a7a72305820dad3df1bec63bca2e0b1144d3958d2db66e2e5e49d697b2a01d5dd5c0619b6ea0029a165627a7a72305820c684c60c393d4907d09b96499f54096cc768a8a116b61a7d123582a46b410ccb0029"};

    public static final String SM_BINARY = String.join("", SM_BINARY_ARRAY);

    public static final String[] ABI_ARRAY = {"[{\"constant\":false,\"inputs\":[{\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"setOwner\",\"outputs\":[],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountByUser\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"unfreeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"userAddress\",\"type\":\"address\"}],\"name\":\"getExternalAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"},{\"name\":\"data\",\"type\":\"address\"}],\"name\":\"newAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"},{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"unfreezeByAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"freezeByAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"freeze\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"name\":\"oldExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountByGovernance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[],\"name\":\"cancelByUser\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[],\"name\":\"_owner\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"cancelByGovernance\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"name\":\"oldExternalAccount\",\"type\":\"address\"}],\"name\":\"setExternalAccountByAdmin\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"hasAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":false,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"cancelByAdmin\",\"outputs\":[{\"name\":\"b\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"getUserAccount\",\"outputs\":[{\"name\":\"\",\"type\":\"address\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"constant\":true,\"inputs\":[{\"name\":\"externalAccount\",\"type\":\"address\"}],\"name\":\"isExternalAccountNormal\",\"outputs\":[{\"name\":\"\",\"type\":\"bool\"}],\"payable\":false,\"stateMutability\":\"view\",\"type\":\"function\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"userAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageNewAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"newExternalAccount\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"oldExternalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageExternalAccount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageFreeze\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageUnfreeze\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"externalAccount\",\"type\":\"address\"},{\"indexed\":false,\"name\":\"accountManagerAddress\",\"type\":\"address\"}],\"name\":\"LogManageCancel\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"name\":\"contractAddress\",\"type\":\"address\"}],\"name\":\"LogSetOwner\",\"type\":\"event\"}]"};

    public static final String ABI = String.join("", ABI_ARRAY);

    public static final String FUNC_SETOWNER = "setOwner";

    public static final String FUNC_SETEXTERNALACCOUNTBYUSER = "setExternalAccountByUser";

    public static final String FUNC_UNFREEZE = "unfreeze";

    public static final String FUNC_GETEXTERNALACCOUNT = "getExternalAccount";

    public static final String FUNC_NEWACCOUNT = "newAccount";

    public static final String FUNC_UNFREEZEBYADMIN = "unfreezeByAdmin";

    public static final String FUNC_FREEZEBYADMIN = "freezeByAdmin";

    public static final String FUNC_FREEZE = "freeze";

    public static final String FUNC_SETEXTERNALACCOUNTBYGOVERNANCE = "setExternalAccountByGovernance";

    public static final String FUNC_CANCELBYUSER = "cancelByUser";

    public static final String FUNC__OWNER = "_owner";

    public static final String FUNC_CANCELBYGOVERNANCE = "cancelByGovernance";

    public static final String FUNC_SETEXTERNALACCOUNTBYADMIN = "setExternalAccountByAdmin";

    public static final String FUNC_HASACCOUNT = "hasAccount";

    public static final String FUNC_CANCELBYADMIN = "cancelByAdmin";

    public static final String FUNC_GETUSERACCOUNT = "getUserAccount";

    public static final String FUNC_ISEXTERNALACCOUNTNORMAL = "isExternalAccountNormal";

    public static final Event LOGMANAGENEWACCOUNT_EVENT = new Event("LogManageNewAccount", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));
    ;

    public static final Event LOGMANAGEEXTERNALACCOUNT_EVENT = new Event("LogManageExternalAccount", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));
    ;

    public static final Event LOGMANAGEFREEZE_EVENT = new Event("LogManageFreeze", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));
    ;

    public static final Event LOGMANAGEUNFREEZE_EVENT = new Event("LogManageUnfreeze", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));
    ;

    public static final Event LOGMANAGECANCEL_EVENT = new Event("LogManageCancel", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>() {}));
    ;

    public static final Event LOGSETOWNER_EVENT = new Event("LogSetOwner", 
            Arrays.<TypeReference<?>>asList(new TypeReference<Address>(true) {}, new TypeReference<Address>(true) {}));
    ;

    protected AccountManager(String contractAddress, Client client, CryptoKeyPair credential) {
        super(getBinary(client.getCryptoSuite()), contractAddress, client, credential);
    }

    public static String getBinary(CryptoSuite cryptoSuite) {
        return (cryptoSuite.getCryptoTypeConfig() == CryptoType.ECDSA_TYPE ? BINARY : SM_BINARY);
    }

    public TransactionReceipt setOwner(String owner) {
        final Function function = new Function(
                FUNC_SETOWNER, 
                Arrays.<Type>asList(new Address(owner)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setOwner(String owner, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETOWNER, 
                Arrays.<Type>asList(new Address(owner)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetOwner(String owner) {
        final Function function = new Function(
                FUNC_SETOWNER, 
                Arrays.<Type>asList(new Address(owner)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetOwnerInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETOWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public TransactionReceipt setExternalAccountByUser(String newExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYUSER, 
                Arrays.<Type>asList(new Address(newExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountByUser(String newExternalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYUSER, 
                Arrays.<Type>asList(new Address(newExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountByUser(String newExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYUSER, 
                Arrays.<Type>asList(new Address(newExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getSetExternalAccountByUserInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYUSER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getSetExternalAccountByUserOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYUSER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt unfreeze(String externalAccount) {
        final Function function = new Function(
                FUNC_UNFREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void unfreeze(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_UNFREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUnfreeze(String externalAccount) {
        final Function function = new Function(
                FUNC_UNFREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getUnfreezeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_UNFREEZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getUnfreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_UNFREEZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String getExternalAccount(String userAddress) throws ContractException {
        final Function function = new Function(FUNC_GETEXTERNALACCOUNT, 
                Arrays.<Type>asList(new Address(userAddress)),
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt newAccount(String externalAccount, String data) {
        final Function function = new Function(
                FUNC_NEWACCOUNT, 
                Arrays.<Type>asList(new Address(externalAccount),
                new Address(data)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void newAccount(String externalAccount, String data, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_NEWACCOUNT, 
                Arrays.<Type>asList(new Address(externalAccount),
                new Address(data)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForNewAccount(String externalAccount, String data) {
        final Function function = new Function(
                FUNC_NEWACCOUNT, 
                Arrays.<Type>asList(new Address(externalAccount),
                new Address(data)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getNewAccountInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_NEWACCOUNT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple2<Boolean, String> getNewAccountOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_NEWACCOUNT, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<Boolean, String>(

                (Boolean) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public TransactionReceipt unfreezeByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_UNFREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void unfreezeByAdmin(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_UNFREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForUnfreezeByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_UNFREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getUnfreezeByAdminInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_UNFREEZEBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getUnfreezeByAdminOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_UNFREEZEBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt freezeByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_FREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void freezeByAdmin(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_FREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForFreezeByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_FREEZEBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getFreezeByAdminInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_FREEZEBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getFreezeByAdminOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_FREEZEBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt freeze(String externalAccount) {
        final Function function = new Function(
                FUNC_FREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void freeze(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_FREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForFreeze(String externalAccount) {
        final Function function = new Function(
                FUNC_FREEZE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getFreezeInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_FREEZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getFreezeOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_FREEZE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt setExternalAccountByGovernance(String newExternalAccount, String oldExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountByGovernance(String newExternalAccount, String oldExternalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountByGovernance(String newExternalAccount, String oldExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getSetExternalAccountByGovernanceInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYGOVERNANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getSetExternalAccountByGovernanceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYGOVERNANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt cancelByUser() {
        final Function function = new Function(
                FUNC_CANCELBYUSER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancelByUser(TransactionCallback callback) {
        final Function function = new Function(
                FUNC_CANCELBYUSER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancelByUser() {
        final Function function = new Function(
                FUNC_CANCELBYUSER, 
                Arrays.<Type>asList(), 
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<Boolean> getCancelByUserOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_CANCELBYUSER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String _owner() throws ContractException {
        final Function function = new Function(FUNC__OWNER, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public TransactionReceipt cancelByGovernance(String externalAccount) {
        final Function function = new Function(
                FUNC_CANCELBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancelByGovernance(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_CANCELBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancelByGovernance(String externalAccount) {
        final Function function = new Function(
                FUNC_CANCELBYGOVERNANCE, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getCancelByGovernanceInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_CANCELBYGOVERNANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getCancelByGovernanceOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_CANCELBYGOVERNANCE, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public TransactionReceipt setExternalAccountByAdmin(String newExternalAccount, String oldExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYADMIN, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void setExternalAccountByAdmin(String newExternalAccount, String oldExternalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYADMIN, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForSetExternalAccountByAdmin(String newExternalAccount, String oldExternalAccount) {
        final Function function = new Function(
                FUNC_SETEXTERNALACCOUNTBYADMIN, 
                Arrays.<Type>asList(new Address(newExternalAccount),
                new Address(oldExternalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple2<String, String> getSetExternalAccountByAdminInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}, new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple2<String, String>(

                (String) results.get(0).getValue(), 
                (String) results.get(1).getValue()
                );
    }

    public Tuple1<Boolean> getSetExternalAccountByAdminOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_SETEXTERNALACCOUNTBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public Boolean hasAccount(String externalAccount) throws ContractException {
        final Function function = new Function(FUNC_HASACCOUNT, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public TransactionReceipt cancelByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_CANCELBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return executeTransaction(function);
    }

    public void cancelByAdmin(String externalAccount, TransactionCallback callback) {
        final Function function = new Function(
                FUNC_CANCELBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        asyncExecuteTransaction(function, callback);
    }

    public String getSignedTransactionForCancelByAdmin(String externalAccount) {
        final Function function = new Function(
                FUNC_CANCELBYADMIN, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Collections.<TypeReference<?>>emptyList());
        return createSignedTransaction(function);
    }

    public Tuple1<String> getCancelByAdminInput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getInput().substring(10);
        final Function function = new Function(FUNC_CANCELBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<String>(

                (String) results.get(0).getValue()
                );
    }

    public Tuple1<Boolean> getCancelByAdminOutput(TransactionReceipt transactionReceipt) {
        String data = transactionReceipt.getOutput();
        final Function function = new Function(FUNC_CANCELBYADMIN, 
                Arrays.<Type>asList(), 
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        List<Type> results = FunctionReturnDecoder.decode(data, function.getOutputParameters());
        return new Tuple1<Boolean>(

                (Boolean) results.get(0).getValue()
                );
    }

    public String getUserAccount(String externalAccount) throws ContractException {
        final Function function = new Function(FUNC_GETUSERACCOUNT, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Arrays.<TypeReference<?>>asList(new TypeReference<Address>() {}));
        return executeCallWithSingleValueReturn(function, String.class);
    }

    public Boolean isExternalAccountNormal(String externalAccount) throws ContractException {
        final Function function = new Function(FUNC_ISEXTERNALACCOUNTNORMAL, 
                Arrays.<Type>asList(new Address(externalAccount)),
                Arrays.<TypeReference<?>>asList(new TypeReference<Bool>() {}));
        return executeCallWithSingleValueReturn(function, Boolean.class);
    }

    public List<LogManageNewAccountEventResponse> getLogManageNewAccountEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGMANAGENEWACCOUNT_EVENT, transactionReceipt);
        ArrayList<LogManageNewAccountEventResponse> responses = new ArrayList<LogManageNewAccountEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageNewAccountEventResponse typedResponse = new LogManageNewAccountEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.userAccount = (String) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.accountManagerAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageNewAccountEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGENEWACCOUNT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogManageNewAccountEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGENEWACCOUNT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<LogManageExternalAccountEventResponse> getLogManageExternalAccountEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGMANAGEEXTERNALACCOUNT_EVENT, transactionReceipt);
        ArrayList<LogManageExternalAccountEventResponse> responses = new ArrayList<LogManageExternalAccountEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageExternalAccountEventResponse typedResponse = new LogManageExternalAccountEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.newExternalAccount = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.oldExternalAccount = (String) eventValues.getIndexedValues().get(1).getValue();
            typedResponse.accountManagerAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageExternalAccountEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEEXTERNALACCOUNT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogManageExternalAccountEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEEXTERNALACCOUNT_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<LogManageFreezeEventResponse> getLogManageFreezeEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGMANAGEFREEZE_EVENT, transactionReceipt);
        ArrayList<LogManageFreezeEventResponse> responses = new ArrayList<LogManageFreezeEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageFreezeEventResponse typedResponse = new LogManageFreezeEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageFreezeEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEFREEZE_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogManageFreezeEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEFREEZE_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<LogManageUnfreezeEventResponse> getLogManageUnfreezeEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGMANAGEUNFREEZE_EVENT, transactionReceipt);
        ArrayList<LogManageUnfreezeEventResponse> responses = new ArrayList<LogManageUnfreezeEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageUnfreezeEventResponse typedResponse = new LogManageUnfreezeEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageUnfreezeEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEUNFREEZE_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogManageUnfreezeEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGEUNFREEZE_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<LogManageCancelEventResponse> getLogManageCancelEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGMANAGECANCEL_EVENT, transactionReceipt);
        ArrayList<LogManageCancelEventResponse> responses = new ArrayList<LogManageCancelEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogManageCancelEventResponse typedResponse = new LogManageCancelEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.externalAccount = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.accountManagerAddress = (String) eventValues.getNonIndexedValues().get(0).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogManageCancelEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGECANCEL_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogManageCancelEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGMANAGECANCEL_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public List<LogSetOwnerEventResponse> getLogSetOwnerEvents(TransactionReceipt transactionReceipt) {
        List<EventValuesWithLog> valueList = extractEventParametersWithLog(LOGSETOWNER_EVENT, transactionReceipt);
        ArrayList<LogSetOwnerEventResponse> responses = new ArrayList<LogSetOwnerEventResponse>(valueList.size());
        for (EventValuesWithLog eventValues : valueList) {
            LogSetOwnerEventResponse typedResponse = new LogSetOwnerEventResponse();
            typedResponse.log = eventValues.getLog();
            typedResponse.owner = (String) eventValues.getIndexedValues().get(0).getValue();
            typedResponse.contractAddress = (String) eventValues.getIndexedValues().get(1).getValue();
            responses.add(typedResponse);
        }
        return responses;
    }

    public void subscribeLogSetOwnerEvent(String fromBlock, String toBlock, List<String> otherTopics, EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI,BINARY,topic0,fromBlock,toBlock,otherTopics,callback);
    }

    public void subscribeLogSetOwnerEvent(EventCallback callback) {
        String topic0 = eventEncoder.encode(LOGSETOWNER_EVENT);
        subscribeEvent(ABI,BINARY,topic0,callback);
    }

    public static AccountManager load(String contractAddress, Client client, CryptoKeyPair credential) {
        return new AccountManager(contractAddress, client, credential);
    }

    public static AccountManager deploy(Client client, CryptoKeyPair credential) throws ContractException {
        return deploy(AccountManager.class, client, credential, getBinary(client.getCryptoSuite()), "");
    }

    public static class LogManageNewAccountEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String userAccount;

        public String accountManagerAddress;
    }

    public static class LogManageExternalAccountEventResponse {
        public TransactionReceipt.Logs log;

        public String newExternalAccount;

        public String oldExternalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageFreezeEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageUnfreezeEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogManageCancelEventResponse {
        public TransactionReceipt.Logs log;

        public String externalAccount;

        public String accountManagerAddress;
    }

    public static class LogSetOwnerEventResponse {
        public TransactionReceipt.Logs log;

        public String owner;

        public String contractAddress;
    }
}
